package jdk7.trywithresources;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * Description: jdk1.7新特性：try-with-resources 声明（try-with-resources declaration）
 * try-with-resources 是一个定义了一个或多个资源的try 声明，这个资源是指程序处理完它之后需要关闭它的对象。
 * try-with-resources 确保每一个资源在处理完成后都会被关闭。 
 * 可以使用try-with-resources的资源有： 任何实现了java.lang.AutoCloseable 接口和java.io.Closeable 接口的对象。
 * 
 * 个人认为：一般有用，让开发者更容易锁定代码出错的地方
 * @author Kwum
 * @date 2017年6月26日 下午4:11:10
 * @version 1.0
 */

public class Run {

    public static void main(String[] args) throws IOException {
        
        String path = "derby.log";
        System.out.println(readFirstLineFromFileWithFinallyBlock(path));
    }
    
    //在java 7 以及以后的版本里，BufferedReader实现了java.lang.AutoCloseable接口。
    //由于BufferedReader定义在try-with-resources 声明里，无论try语句正常还是异常的结束， 它都会自动的关掉。
    //而在java7以前，你需要使用finally块来关掉这个对象。如下
    //然而，如果 readLine() 和 close() 这两个方法都抛出异常，
    //那么readFirstLineFromFileWithFinallyBlock 方法只会抛出后面部分也就是finally块中的内容，try块中的异常就被抑制了
    //而在java 7中，无论是try块还是try-with-resource中抛出异常，都能捕捉到。
    //此外，try-with-resources 可以跟catch和finally，catch和finally的是在try-with-resources里声明的对象关闭之后才执行的。
    public static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        try {
            return br.readLine();
        } 
        //jdk7之后可以不写下面的代码
        finally {
            if (br != null) {
                br.close(); 
            }
        } 
    }
}
